非遞歸:
/**
* 用一個遍歷來裝排好序的鏈表,和一個遍歷記錄最其實的位置。
* @param l1
* @param l2
* @return
*/
public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode result = null;
ListNode start = null;
if (l1.val < l2.val) {
result = l1;
l1 = l1.next;
} else {
result = l2;
l2 = l2.next;
}
start = result;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
result.next = l1;
result = l1;
l1 = l1.next;
} else {
result.next = l2;
result = l2;
l2 = l2.next;
}
}
if (l1 == null) {
result.next = l2;
} else {
result.next = l1;
}
return start;
}
遞歸:
public static ListNode mergeTwoListsRecursion(ListNode l1, ListNode l2) {
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
if(l1.val<=l2.val){
ListNode next = l1.next; //先把l1的next拿出來與l2做合併
ListNode listNode = mergeTwoListsRecursion(next, l2);
l1.next=listNode; //把l1指向合併完的結果。
return l1;
}else {
ListNode next = l2.next;
ListNode listNode = mergeTwoListsRecursion(l1, next);
l2.next=listNode;
return l2;
}
}
1->3
2->4
參考資料:https://leetcode-cn.com/problems/merge-two-sorted-lists/submissions/
官方答案:
public static ListNode mergeTwoLists2(ListNode l1, ListNode l2) {
// 類似歸併排序中的合併過程
ListNode dummyHead = new ListNode(0);
ListNode cur = dummyHead;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
cur.next = l1;
cur = cur.next;
l1 = l1.next;
} else {
cur.next = l2;
cur = cur.next;
l2 = l2.next;
}
}
// 任一爲空,直接連接另一條鏈表
if (l1 == null) {
cur.next = l2;
} else {
cur.next = l1;
}
return dummyHead.next;
}