目錄
Leetcode鏈表問題
對刷到的鏈表問題進行一下彙總。(持續更新)
鏈表翻轉問題
Q1_25. K 個一組翻轉鏈表
給你一個鏈表,每 k 個節點一組進行翻轉,請你返回翻轉後的鏈表。
k 是一個正整數,它的值小於或等於鏈表的長度。
如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。
示例 :
給定這個鏈表:1->2->3->4->5
當 k = 2 時,應當返回: 2->1->4->3->5
當 k = 3 時,應當返回: 3->2->1->4->5
說明 :
你的算法只能使用常數的額外空間。
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
這一道題在面試的時候被問到的頻率比較高,在leetcode上屬於一道困難級別的題目,主要難點在與翻轉。
解題思路:
一邊遍歷一邊翻轉,對於最後一次,如果不足k個,就再翻轉一次即可。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if(head==null || k<=1 || head.next==null) return head;
ListNode p=new ListNode(0);
p.next=head;
ListNode q=head;
ListNode pre=p;
while(q.next!=null){
int m=k;
while(m>1 && q.next!=null){
ListNode temp=q.next;
q.next=temp.next;
temp.next=pre.next;
pre.next=temp;
m--;
}
if(m>1){
m=k;
q=pre.next;
while(m>0 && q.next!=null){
ListNode temp=q.next;
q.next=temp.next;
temp.next=pre.next;
pre.next=temp;
m--;
}
break;
}
pre=q;
q=q.next;
if(q==null) break;
}
return p.next;
}
}
Q2_24. 兩兩交換鏈表中的節點
給定一個鏈表,兩兩交換其中相鄰的節點,並返回交換後的鏈表。
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
示例:
給定 1->2->3->4, 你應該返回 2->1->4->3.
解題思路:
我們只需要將Q1中的k設置成2就行了,當然也可以直接做。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
if(head==null || head.next==null) return head;
ListNode q=new ListNode(0);
q.next=head;
ListNode pre=q;
boolean first=true;
while(head.next!=null){
ListNode p=head.next;
head.next=p.next;
p.next=head;
head=head.next;
pre.next=p;
pre=p.next;
if(head==null) break;
}
return q.next;
}
}
鏈表合併問題
Q3_21. 合併兩個有序鏈表
將兩個有序鏈表合併爲一個新的有序鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。
示例:
輸入:1->2->4, 1->3->4 ; 輸出:1->1->2->3->4->4
解題思路:
1.遍歷兩個鏈表,不妨假定l1的表頭比較小,我們就以l1的表頭作爲新鏈表的表頭,然後遍歷l2。
2.如果l2的p,小於l1的當前結點q,就將p插到q前,p=p.next;否則,q=q.next,然後重複本步。
3.最後判斷l2是否遍歷完全,遍歷完了就結束,沒遍歷完就將q插入到p之後。
/**
* 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(l2==null) return l1;
if(l1==null) return l2;
ListNode head=new ListNode(0);
boolean isl1=true;
if(l1.val>l2.val){
head=l2;
isl1=false;
}
else head=l1;
ListNode p=head.next;
ListNode q=head;
while(p!=null && l1!=null && l2 !=null){
if(isl1){
if(l2.val<p.val){
ListNode temp=l2.next;
q.next=l2;
l2.next=p;
l2=temp;
q=q.next;
}else{
p=p.next;
q=q.next;
}
}
else{
if(l1.val<p.val){
ListNode temp=l1.next;
q.next=l1;
l1.next=p;
l1=temp;
q=q.next;
}else{
p=p.next;
q=q.next;
}
}
}
if(isl1){
if(l2!=null) q.next=l2;
}
else{
if(l1!=null) q.next=l1;
}
return head;
}
}