題目:
將兩個有序鏈表合併爲一個新的有序鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。
示例:
輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4
思路:
整體思路類似歸併排序,選擇兩個鏈表 l1,l2 中較小的元素加入新的鏈表l3,最後若l1,l2中一個遍歷完,另一個鏈表還有元素未遍歷,則將未遍歷的元素直接添加到l3的末尾。
代碼:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
ListNode p,q,r,l3;
p = l1;
q = l2;
if(p.val>q.val){
l3 = new ListNode(q.val);
q = q.next;
}else{
l3 = new ListNode(p.val);
p = p.next;
}
r = l3;
while(p!=null&&q!=null){
if(p.val>q.val){
r.next = q;
q = q.next;
}else{
r.next = p;
p = p.next;
}
r = r.next;
}
if(p==null){
r.next = q;
}
if(q==null){
r.next = p;
}
return l3;
}
}
優化:
可不使用額外的輔助鏈表 l3,而是直接將合併的結果放入l1,由於鏈表插入的時間複雜度爲O(1),整體時間複雜度和空間複雜度都不會太高,並未嘗試 -.-!