Leetcode鏈表問題

目錄

Leetcode鏈表問題

鏈表翻轉問題

Q1_25. K 個一組翻轉鏈表

Q2_24. 兩兩交換鏈表中的節點

鏈表合併問題

Q3_21. 合併兩個有序鏈表


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;
    }
}

 

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