將兩個有序鏈表合併爲一個新的有序鏈表並返回。新鏈表是經過拼接給定的兩個鏈表的全部節點組成的。 html
示例:node
輸入:1 -> 2 -> 4 ,1 -> 3 -> 4算法
輸出:1 -> 1 -> 2 -> 3 -> 4 -> 4spa
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { //若是 l1 或者 l2 一開始就是 null ,說明不須要合併,因此咱們只須要返回非空鏈表
if(l1 == null) { return l2; } if(l2 == null) { return l1; } //若是11的val值更小,則將11.next與排序好的鏈表頭相接,12同理
if(l1.val < l2.val) { l1.next = mergeTwoLists(l1.next, l2); //每一層調用都返回排序好的鏈表頭
return l1; } else { l2.next = mergeTwoLists(l1, l2.next); return l2; } } }
咱們假設 l1
元素嚴格比 l2
元素少,咱們能夠將 l2
中的元素逐一插入 l1
中正確的位置。3d
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { //先初始化一個預先指針 prehead,該指針的下一個節點指向真正的頭結點head,是用來定位頭結點的
listnode prehead = new listnode(-1); listnode prev = prehead; //遍歷列表l1和l2,直到所有遍歷完畢
while (l1 != null && l2 != null) { if (l1.val <= l2.val) { //prev.next始終指向比較以後的那個小的,l2同理
prev.next = l1; //當前位置的l1後移一位
l1 = l1.next; } else { prev.next = l2; l2 = l2.next; } prev = prev.next; } //在循環終止的時候, l1 和 l2 至多有一個是非空的。 //須要將非空鏈表接在合併鏈表的後面,並返回合併鏈表。
prev.next = l1 == null ? l2 : l1; return prehead.next; } }
依次類推,最後:指針