Leetcode刷題Java21. 合併兩個有序鏈表

將兩個升序鏈表合併爲一個新的升序鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 

示例:

輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/merge-two-sorted-lists
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

class Solution {
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//            return mergeTwoListI(l1, l2);
            return mergeTwoListsII(l1, l2);
        }

        //方法二:迭代法
        //定義哨兵指針preHead和prev指針
        //如果l1.val < l2.val,則將prev.next指向l1,同時l1向後移動1位;否則指向l2,l2向後移動1位
        //不管prev.next指向l1或l2,prev都將向後移動1位
        //如果兩個鏈表中一個爲空,由於新鏈表已經是排序好的,只需將鏈表剩下的元素與新鏈表對接即可
        private ListNode mergeTwoListsII(ListNode l1, ListNode l2) {
            ListNode preHead = new ListNode(0);
            ListNode prev = prevHead;
            while (l1 != null && l2 != null) {
                if (l1.val <= l2.val) {
                    prev.next = l1;
                    l1 = l1.next;
                } else {
                    prev.next = l2;
                    l2 = l2.next;
                }
                prev = prev.next;
            }
            prev.next = (l1 == null) ? l2 : l1;
            return preHead.next;
        }

        //方法一:遞歸法
        //1.終止條件
        //2.返回值,遞歸返回的是排序好的鏈表頭節點
        //3.本次調用
        //如果l1.val < l2.val,則將l1.next與排序好的鏈表對接;反之,則將l2.next與排序好的鏈表對接
        private ListNode mergeTwoListI(ListNode l1, ListNode l2) {
            if (l1 == null || l2 == null) return (l1 == null) ? l2 : l1;
            if (l1.val < l2.val) {
                l1.next = mergeTwoLists(l1.next, l2);
                return l1;
            } else {
                l2.next = mergeTwoLists(l1, l2.next);
                return l2;
            }
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章