劍指OFFER-合併兩個排序的連結串列(Java)
阿新 • • 發佈:2020-12-09
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;
}
}