1. 程式人生 > >LeetCode---876.連結串列的中間結點

LeetCode---876.連結串列的中間結點

題目來源:https://leetcode-cn.com/problems/middle-of-the-linked-list/description/

題目描述:

 該題目有兩種做法,第一種比較容易想到,但是時間複雜度較高。

第一種:

這種做法比較簡單,先遍歷一遍連結串列計算出連結串列的結點個數,然後跑到length/2的位置就行了

程式碼如下:

struct ListNode* middleNode(struct ListNode* head) {
    if(head==NULL||head->next==NULL){
        return head;
    }
    int length=0;
    struct ListNode* p;
    for(p=head;p;p=p->next){
        length++;
    }
    p=head;
    for(int i=0;i<length/2;p=p->next,i++);
    return p;
}

 

第二種:

這個做法就是利用兩個指標,一個快指標,一個慢指標。兩個指標從head開始遍歷。快指標一次跑兩步,慢指標一次跑一步。當快指標遍歷完一個連結串列之後,慢指標就跑到了中間節點。然後再根據題目要求修改(因為當節點個數為偶數時,有時候要求是靠前的節點,有時要求靠後的結點。本題要求的是靠後的結點)。

程式碼如下:

struct ListNode* middleNode(struct ListNode* head) {
    if(head==NULL||head->next==NULL){
        return head;
    }
    struct ListNode* fastp=head;
    struct ListNode* slowp=head;
    while(fastp->next&&fastp->next->next){
        fastp=fastp->next->next;
        slowp=slowp->next;
    }
    if(fastp->next){
        return slowp->next;
    }else{
        return slowp;
    }
}