链表——寻找中间结点(快慢指针法)

一般方法

链表这种无法随机存取的数据结构,要定位到中间结点的方法通常是先把整个链表遍历一遍,得到整个链表的长度,再除以2,得到中间结点的位置,接着根据这个位置从头结点开始找到这个结点,时间复杂度为O(1.5n)具体代码如下

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
	ListNode* middleNode(ListNode* head) {
		int len = 0;
		ListNode *pt = head;
		while (pt != nullptr)
		{
			len++;
			pt = pt->next;
		}
		int mid = len / 2;
		pt = head;
		while (mid--)
			pt = pt->next;
		return pt;
	}
};

快慢指针法

这是我在LeetCode上学习到的方法,我自己把这种方法称作长短腿法(感觉很形象)

class Solution {
public:
	ListNode* middleNode(ListNode* head) {
		ListNode *longleg = head, *shortleg = head;
    while(longleg != nullptr && longleg->next != nullptr)
    {
      longleg = longleg->next->next;
      shortleg = shortleg->next;
    }
    return shortleg;
  }
};

长腿走两步,短腿走一步,当长腿走到链表末尾时,短腿刚好走到链表的一半,时间复杂度为O(n)

发布了15 篇原创文章 · 获赞 4 · 访问量 467

猜你喜欢

转载自blog.csdn.net/benobug/article/details/105052700