1. 程式人生 > 其它 >劍指OFFER-合併兩個排序的連結串列(Java)

劍指OFFER-合併兩個排序的連結串列(Java)

技術標籤:連結串列java

1. 反轉連結串列

1.1 題目描述

輸入一個連結串列,反轉連結串列後,輸出新連結串列的表頭。

1.2 示例1

輸入

{1,2,3}

返回值

{3,2,1}

1.3 核心程式碼實現

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode ReverseList(ListNode head)
{ if(head == null || head.next == null) return head; ListNode pre = null; //pre記錄當前節點的前一個節點 ListNode next = null; //next記錄當前節點的下一個節點 while(head != null){ next = head.next; //先用next指標記錄當前節點的下一個節點地址 head.next = pre; //讓當前節點與連結串列斷開並指向前一個節點pre,反轉
pre = head; //繼續下一個節點 head = next; } return pre; } }

2. 合併兩個排序的連結串列

2.1 題目描述

輸入兩個單調遞增的連結串列,輸出兩個連結串列合成後的連結串列,當然我們需要合成後的連結串列滿足單調不減規則。

2.2 示例1

輸入

{1,3,5},{2,4,6}

返回值

{1,2,3,4,5,6}

2.3 核心程式碼實現

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution { public ListNode Merge(ListNode list1,ListNode list2) { /* //遞迴,若list1<list2,則list1為新序列的頭節點,繼續比較list1.next與list2 if(list1 == null) return list2; if(list2 == null) return list1; if(list1.val < list2.val){ list1.next = Merge(list1.next, list2); return list1; }else{ list2.next = Merge(list2.next, list1); return list2; } */ ListNode head = new ListNode(0); //初始化一個節點值為0的空節點 ListNode result = head; while(list1 != null && list2 != null){ if(list1.val < list2.val){ result.next = list1; list1 = list1.next; }else{ result.next = list2; list2 = list2.next; } result = result.next; } if(list1 != null) //list1的節點多於list2的 result.next = list1; if(list2 != null) //list2的節點多於list1的 result.next = list2; return head.next; } }