合并兩個有序鏈表-leetcode
題目描述
將兩個升序鏈表合并為一個新的 升序 鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。
示例 1:

輸入:l1 = [1,2,4], l2 = [1,3,4]
輸出:[1,1,2,3,4,4]
示例 2:
輸入:l1 = [], l2 = []
輸出:[]
示例 3:
輸入:l1 = [], l2 = [0]
輸出:[0]
提示:
- 兩個鏈表的節點數目范圍是
[0, 50] -100 <= Node.val <= 100l1和l2均按 非遞減順序 排列
解法一
思路:
迭代的方法。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if (list1 == null) return list2;
if (list2 == null) return list1;
ListNode p,q,r;
p=list1;q=list2;
ListNode head=new ListNode(0);
r=head;
while(p!=null&&q!=null){
if(p.val<q.val ){
r.next = p;
p=p.next;
}else{
r.next = q;
q=q.next;
}
r=r.next;
if(p==null)r.next=q;
if(q==null)r.next=p;
}
return head.next;
}
}/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
if (head == null || head.next == null) return null;
Set<ListNode> set = new HashSet<>();
ListNode p=head;
while (p!=null) {
if(set.contains(p)) return p;
set.add(p);
p = p.next;
}
return null;
}
}
解法二
思路:
官方遞歸的方法。
代碼:
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
} else if (l2 == null) {
return l1;
} else if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
}

浙公網安備 33010602011771號